package com.realtyreg.service.util;

import eu.medsea.mimeutil.MimeType;
import eu.medsea.mimeutil.MimeUtil;
import org.imgscalr.Scalr;
import com.realtyreg.common.exception.BusinessException;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Petro 12.03.13 0:57
 */
public class ImageUtil {
    public static final int AVATAR_BIG_SIZE = 200;
    public static final int AVATAR_SMALL_SIZE = 30;

    /**
     * Изменяет размер фото профиля
     * Если размер оригинального изображения меньше требуемого размера, то размер не изменяется.
     * @param bytes    исходное изображение в виде массива байт
     * @param size     размер. Если не указан, то считаем, что resize не нужен и возвращается <code>bytes</code>
     * @return изображение, с измененным размером, в виде массива байт
     */
    public static byte[] resize(byte[] bytes, Integer size) {
        //если размер не указан, то resize не нужен
        if (size == null)
            return bytes;

        InputStream inputStream = null;
        ByteArrayOutputStream outputStream = null;
        try {
            //1. преобразование из byte[] в BufferedImage
            MimeType mimeType = MimeUtil.getMostSpecificMimeType(MimeUtil.getMimeTypes(bytes));
            inputStream = new ByteArrayInputStream(bytes);
            BufferedImage originalImage = ImageIO.read(inputStream);
            //2. resize
            if (size >= originalImage.getWidth() && size >= originalImage.getHeight())
                return bytes;
            BufferedImage resizedImage = Scalr.resize(originalImage, size);
            //3. преобразование из BufferedImage в byte[]
            outputStream = new ByteArrayOutputStream();
            outputStream.flush();
            boolean writeRes = ImageIO.write(resizedImage, mimeType.getSubType(), outputStream);
            if (!writeRes)
                throw new BusinessException("Не найден подходящий writer для mime-типа " + mimeType.getSubType());
            return outputStream.toByteArray();
        } catch (Exception e) {
            throw new BusinessException("Ошибка при изменении размера фото", e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException ignore) {
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException ignore) {
                }
            }
        }
    }
}
